﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;
using System.Web.Security;
using SPMS.Data;

namespace SPMS.Common
{
    /// <summary>
    /// 窗体认证用户信息。
    /// </summary>
    public class FormsPrincipal : GenericPrincipal
    {
        #region ---Constructor

        /// <summary>
        /// 初始化类型<see cref="FormsPrincipal" />的新实例。
        /// </summary>
        /// <param name="identity">用户标识。</param>
        /// <param name="logonUser">当前登录用户信息。</param>
        /// <param name="sessionID">会话编号。</param>
        /// <param name="roles">用户所属角色。</param>
        /// <param name="functionalities">用户拥有的功能。</param>
        public FormsPrincipal(FormsIdentity identity, User logonUser, Guid sessionID, UserRoleView[] roles, int[] functionalities)
            : base(identity, FormsPrincipal.ToArray(roles))
        {
            //保存参数
            this.m_LogonUser = logonUser;
            this.m_SessionID = sessionID;
            this.m_Roles = roles ?? new UserRoleView[0];
            this.m_Functionalities = functionalities ?? new int[0];
        }

        #endregion

        #region ---Property

        /// <summary>
        /// 获得当前用户拥有的权限列表。
        /// </summary>
        /// <value>
        /// 当前用户拥有的权限列表。
        /// </value>
        public int[] Functionalities
        {
            get
            {
                return this.m_Functionalities;
            }
        }

        /// <summary>
        /// 获得会话编号。
        /// </summary>
        /// <value>
        /// 会话编号。
        /// </value>
        public Guid SessionID
        {
            get
            {
                return this.m_SessionID;
            }
        }

        /// <summary>
        /// 获得当前登录用户信息。
        /// </summary>
        /// <value>
        /// 当前登录用户信息。
        /// </value>
        public User LogonUser
        {
            get
            {
                return this.m_LogonUser;
            }
        }

        /// <summary>
        /// 获得当前登录用户拥有的角色。
        /// </summary>
        /// <value>
        /// 当前登录用户拥有的角色。
        /// </value>
        public UserRoleView[] Roles
        {
            get
            {
                return this.m_Roles;
            }
        }

        #endregion

        #region ---Private Method

        /// <summary>
        /// 将用户角色视图数组转换为字符串数组。
        /// </summary>
        /// <param name="roles">要转换的用户角色视图数组。</param>
        /// <returns>包含角色名称的字符串数组。</returns>
        private static string[] ToArray(UserRoleView[] roles)
        {
            //判断是否有效
            if (null != roles && roles.Length > 0)
            {
                //获得角色名称
                return roles.Select(item => item.Role_Name).ToArray();
            }

            //返回空字符串
            return new string[0];
        }

        #endregion

        #region ---Field

        /// <summary>
        /// 当前用户拥有的权限列表。
        /// </summary>
        private int[] m_Functionalities;

        /// <summary>
        /// 当前登录用户信息。
        /// </summary>
        private User m_LogonUser;

        /// <summary>
        /// 当前会话编号。
        /// </summary>
        private Guid m_SessionID;

        /// <summary>
        /// 当前用户拥有的角色
        /// </summary>
        private UserRoleView[] m_Roles;

        #endregion
    }
}
